package cn.mylearn.tools.poi;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class PoiExcelImport {

	private static Map<String, String> map = new HashMap<String, String>();
	private String key; // id
	private Object value;// 值
	
	private Integer nowpage;//nowpage 起始页(第0页开始)
	private Integer startrownum;//startrownum 起始行 (第0行开始)
	private String reg; // 替换字符

	private static Integer num=0; //空行总数
	private static Logger log=Logger.getLogger(PoiExcelImport.class);	
	private List<Map<String, Object>> list=new ArrayList<Map<String, Object>>();
	
	public PoiExcelImport(Integer nowpage, Integer startrownum, String reg) {
		this.nowpage = nowpage;
		this.startrownum = startrownum;
		this.reg = reg;
	}
	
	public PoiExcelImport(String key, Object value, Integer nowpage, Integer startrownum, String reg) {
		this.key = key;
		this.value = value;
		this.nowpage = nowpage;
		this.startrownum = startrownum;
		this.reg = reg;
	}
 
	
	/**
	 * 
	 * @描述: 读取excel
	 *
	 * @时间: 2018年1月29日 上午2:59:57 
	 * 
	 * @版本: V1.0
	 */
	public void readExcel(String path) {
		File file = new File(path);
		String substring = path.substring(path.lastIndexOf(".")+1);
		Workbook workbook=null;
		try {
			FileInputStream fileInputStream = new FileInputStream(file);
			if("XLS".equals(substring.toUpperCase())) {
				workbook = new HSSFWorkbook(fileInputStream);
			}else {
				if("XLSX".equals(substring.toUpperCase()))
				workbook = new XSSFWorkbook(file);
			}
			importexcel(workbook);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (InvalidFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				workbook.close();
			} catch (IOException e) {
				log.error(e);
			}
		}
//		importexcel(workbook);
	}
	
	/**
	 * 
	 * @描述: 返回一个List集合
	 *
	 * @时间: 2018年1月29日 上午12:49:28
	 * 
	 * @版本: V1.0
	 */
	public void importexcel(Workbook workbook) {
		try {
			Sheet sheetAt = workbook.getSheetAt(this.nowpage);
			Row row = sheetAt.getRow(this.startrownum);// 第二行开始；
			if (row != null) {
				for (int j = 0; j < row.getLastCellNum(); j++) {
					Cell cell = row.getCell(j);
					if (cell != null) {
						switch (cell.getCellTypeEnum()) {
						case STRING:
							if (cell.getStringCellValue().indexOf("#") >= 0) {
								map.put("_" + j, cell.getStringCellValue().replace("#", ""));
							}
							break;
						default:
							break;
						}
					}
				}
			}
			int lastRowNum = sheetAt.getPhysicalNumberOfRows();
			for (int i = this.startrownum + 1; i < lastRowNum; i++) { // 起始行+1开始
				row = sheetAt.getRow(i);// 第startrownum+1行开始；
				isRowEmptyNums(row);
			}
			lastRowNum=lastRowNum-num; //总行数-空行数
			int physicalNumberOfCells = row.getPhysicalNumberOfCells();// 获取格子总数
			for (int i = this.startrownum + 1; i < lastRowNum; i++) { // 起始行+1开始  
				row = sheetAt.getRow(i);// 第startrownum+1行开始；
				Map<String, Object> cell2 = new HashMap<String, Object>();
				if(StringUtils.isNotEmpty(this.key))
					cell2.put(key, value);
				for (int j = 0; j < physicalNumberOfCells; j++) {
					Cell cell = row.getCell(j);
					if (cell != null) {
						String string = map.get("_" + j);
						if (StringUtils.isNotEmpty(string)) {
							cell2.put(string, getCellValue(cell)); // 取值
						}
					}
				}
				list.add(cell2);
			}
		} catch (Exception e) {
			log.error(e);
		}
		num=0;
	}

	/**
	 * 
	 * @描述: 格子的获取值
	 *
	 * @时间: 2018年1月29日 上午12:39:17
	 * 
	 * @版本: V1.0
	 */
	public Object getCellValue(Cell cell) {
		CellType cellTypeEnum = cell.getCellTypeEnum();
		switch (cellTypeEnum) {
		case _NONE: // 不知道什么意思
			return "";
		case BLANK:// 空格
			return "";
		case ERROR:// 错误,不知道干什么
			return "";
		case NUMERIC:// 数字
			return formmat(cell); // numberic 分数字格式 和日期格式
		case STRING:// 字符串
			return cell.getStringCellValue();
		case BOOLEAN:// boolean
			return cell.getBooleanCellValue();
		case FORMULA:// 公式
			return "";// 待续
		default:
			return "";
		}
	}

	/**
	 * 
	 * @描述: 数字/日期格式化
	 *
	 * @时间: 2018年1月29日 上午12:35:26
	 * 
	 * @版本: V1.0
	 */
	public Object formmat(Cell cell) {
		if (DateUtil.isCellDateFormatted(cell)) { // poi 自带工具类判断是否为日期格式
			return cell.getDateCellValue();
		} else {
			return cell.getNumericCellValue();
		}
	}

	/**
	 * 
	 * @描述: 是否为空行
	 *
	 * @时间: 2018年1月29日 上午2:12:57 
	 * 
	 * @版本: V1.0
	 */
	public static boolean isRowEmpty(Row row) {
		for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {
			Cell cell = row.getCell(c);
			if (cell != null && cell.getCellTypeEnum() != CellType.BLANK)
				return false;
		}
		return true;
	}
	
	/**
	 * 
	 * @描述: 空行计数
	 *
	 * @时间: 2018年1月29日 上午2:13:14 
	 * 
	 * @版本: V1.0
	 */
	public void isRowEmptyNums(Row row) {
		if(isRowEmpty(row)) {
			num++;
		}
	}

	public static Map<String, String> getMap() {
		return map;
	}

	public static void setMap(Map<String, String> map) {
		PoiExcelImport.map = map;
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public Object getValue() {
		return value;
	}

	public void setValue(Object value) {
		this.value = value;
	}
	public Integer getNowpage() {
		return nowpage;
	}

	public void setNowpage(Integer nowpage) {
		this.nowpage = nowpage;
	}

	public Integer getStartrownum() {
		return startrownum;
	}

	public void setStartrownum(Integer startrownum) {
		this.startrownum = startrownum;
	}
	
	public String getReg() {
		return reg;
	}

	public void setReg(String reg) {
		this.reg = reg;
	}
	public List<Map<String, Object>> getList() {
		return list;
	}
	

}
